package com.thread.testThreadLocal;


import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description: ThreadLocal是线程的局部变量，是每一个线程单独持有。其他线程不能访问，通常是类中的private static。
 * 是对该字段的初始值的一个拷贝，通常希望状态与某一个线程线程进行绑定(用户id等)；
 * <p>
 * 当使用ThreadLocal维护变量时，为每一个使用该变量的线程提供一个单独的变量副本。
 * 即每个线程内部都会有一个该变量，这样多线程情况下访问该变量并不会互相影响。因为他们都是自己从内存中拷贝出来的副本。
 * <p>
 * ThreadLocalMap是内部静态类，它的Entry内部静态类，继承弱引用WeakReference<>
 * Entry使用ThreadLocal作为key,变量作为value
 * <p>
 * ThreadLocal对Thread的引用全部通过局部变量完成，没有一个全部变量。
 * 实际的资源副本存储在Thread的ThreadLocalMap中
 * 这说明，ThreadLocal其实只是关联Thread和器资源副本的桥梁，实际上Thread和资源副本的生命周期是紧密关联的。
 * 所以说当Thread被回收时，其资源副本也会被回收
 * 虽然ThreadLocal
 * <p>
 * <p>
 * 注意：在保存进入ThreadLocal时，如果该对象是共享对象，那么多个线程的ThreadLocal.get()取得的还是这个共享变量本身。还是由于线程安全问题。
 * 所以在保存进入ThreadLocal时，先要进行克隆或者new操作
 * @author: conceit
 * @Date: 2018/8/27 17:49
 */
public class MainTest {

    public static final ThreadLocal<Integer> value = new ThreadLocal<>();


    public static void main(String[] args) {

        MainTest.InnerMainTest innerMainTest = new MainTest.InnerMainTest();
        new Thread(innerMainTest, "线程1").start();
        new Thread(innerMainTest, "线程2").start();
        new Thread(innerMainTest, "线程3").start();

    }


    /**
     * @Description: MainTest 执行多任务的内部类
     * @author: conceit
     * @Date: 2018/8/28 16:01
     * @see java.lang.Thread
     */
    static class InnerMainTest extends Thread {

        @Override
        public void run() {

            int uniqueId = UniqueThreadIdGenerator.getCurrentThreadUniqueId();
            System.out.println("当前生成的uniqueId为-->" + uniqueId);

            for (int i = 0; i < 3; i++) {
                try {
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() + " is asking for data, uniqueId is:" + uniqueId);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + "multiThread is final");

        }

    }


}







